﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using Sispe.Entities;
using Sispe.BussinesLogic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace Sispe.Mvc4.Controllers
{
    public class ContratoController : Controller
    {
        #region Dependencias

        [Dependency]
        public IContratoBL contratoBL { get; set; }

        [Dependency]
        public ITipoPersonalBL tipoPersonalBL { get; set; }

        [Dependency]
        public IEspecialidadBL especialidadBL { get; set; }

        [Dependency]
        public ITipoPagoBL tipoPagoBL { get; set; }
        
        [Dependency]
        public ITipoTrabajadorBL tipoTrabajadorBL { get; set; }

        [Dependency]
        public ITrabajadorBL trabajadorBL { get; set; }

        [Dependency]
        public IEntidadPrestadoraSaludBL entidadBL { get; set; }

        [Dependency]
        public IProyectoBL proyectoBL { get; set; }

        [Dependency]
        public IPeriodoPagoBL periodoBL { get; set; }

        [Dependency]
        public IRegimenLaboralBL regLabBL { get; set; }

        [Dependency]
        public IRegimenSaludBL regimenSaludBL { get; set; }

        [Dependency]
        public ITipoContratoBL tipoContratoBL { get; set; }

        [Dependency]
        public IMotivoFinPeriodoBL motivoBL { get; set; }

        [Dependency]
        public IAreaContratoBL areaContratoBL { get; set; }

        [Dependency]
        public IPersonaBL personaBL { get; set; }

        #endregion

        public ActionResult Index()
        {
            var contratos = contratoBL.GetAllFromContratos();
            return View(contratos);
        }

        [HttpPost]
        public ActionResult Index(string criterio = "")
        {
            var contratos = contratoBL.GetAllFromContratosVigentes();
            return View(contratos);
        }

        public ActionResult Details(int id)
        {
            return View();
        }


        public ActionResult Search(string nombreTrabajador)
        {
            var result = trabajadorBL.GetAllFromTrabajador()
                .Where(r => r.PERSONA.NombreCompleto.ToUpper().StartsWith(nombreTrabajador.ToUpper()) 
                    || r.PERSONA.NombreCompleto.ToUpper().Contains(nombreTrabajador.ToUpper()))
                .Take(10)
                .Select(r => new { id = r.Id, label = r.PERSONA.NombreCompleto, name = "Id_Trabajador" });
                
            return Json(result, JsonRequestBehavior.AllowGet);
            
        }


        public ActionResult Create()
        {
            var tipoPersonal = tipoPersonalBL.GetAllFromTipoPersonal();
            ViewData["IdTipoPersonal"] = new SelectList(tipoPersonal, "IdTipoPersonal", "Descripcion");

            var tipoTrabajador = tipoTrabajadorBL.GetAllFromTipoTrabajador();
            ViewData["IdTipoTrabajador"] = new SelectList(tipoTrabajador, "IdTipoTrabajador", "Descripcion");

            var tipoContrato = tipoContratoBL.GetAllFromTipoContrato();
            ViewData["IdTipoContrato"] = new SelectList(tipoContrato, "IdTipoContrato", "Descripcion");

            var areaContrato = areaContratoBL.GetAllFromAreaContrato();
            ViewData["IdAreaContrato"] = new SelectList(areaContrato, "IdAreaContrato", "Descripcion");

            var regimenLaboral = regLabBL.GetAllFromRegimenLaboral();
            ViewData["IdRegimenLaboral"] = new SelectList(regimenLaboral, "IdRegimenLaboral", "Descripcion");

            var entPrestSalus = entidadBL.GetAllFromEntidadPrestadoraSalud();
            ViewData["IdEntidadPrestadoraSalud"] = new SelectList(entPrestSalus, "IdEntidadPrestadoraSalud", "Descripcion");

            var regimenSalud = regimenSaludBL.GetAllFromRegimenSalud();
            ViewData["IdRegimenSalud"] = new SelectList(regimenSalud, "IdRegimenSalud", "Descripcion");

            var proyecto = proyectoBL.GetAllFromProyectos();
            ViewData["IdProyecto"] = new SelectList(proyecto, "IdProyecto", "NombreProyecto");

            var especialidad = especialidadBL.GetAllFromEspecialidad();
            ViewData["IdEspecialidad"] = new SelectList(especialidad, "IdEspecialidad", "Descripcion");

            var periodoPago = periodoBL.GetAllFromPeriodoPago();
            ViewData["IdPeriodoPago"] = new SelectList(periodoPago, "IdPeriocidadPago", "Descripcion");

            var tipoPago = tipoPagoBL.GetAllFromTipoPago();
            ViewData["IdTipoPago"] = new SelectList(tipoPago, "IdTipoPago", "Descripcion");

            
            return View();
        }

        [HttpPost]
        public ActionResult Create(FormCollection colection)
        {
            var a = colection["FechaInicio"].ToString(); 
            var b = colection["FechaTermino"].ToString();
            var FechaInicio = a.Substring(3, 2) + "/" + a.Substring(0, 2) + "/" + a.Substring(6, 4);
            var FechaTermino = b.Substring(3, 2) + "/" + b.Substring(0, 2) + "/" + b.Substring(6, 4);            

            CONTRATO contrato = new CONTRATO();
            try
            {
                ///
                var motivo = motivoBL.GetFromMotivoFinPeriodoById(1);
                ///
                #region newContrato
                contrato.IdMotivoFinPeriodo = motivo.IdMotivoFinPeriodo;
                contrato.IdTipoPersonal = Int32.Parse(colection["IdTipoPersonal"].ToString());
                contrato.IdTipoTrabajador = Int32.Parse(colection["IdTipoTrabajador"].ToString());
                contrato.IdTipoContrato = Int32.Parse(colection["IdTipoContrato"].ToString());
                contrato.IdAreaContrato = Int32.Parse(colection["IdAreaContrato"].ToString());
                contrato.IdRegimenLaboral = Int32.Parse(colection["IdRegimenLaboral"].ToString());
                contrato.IdEntidadPrestadoraSalud = Int32.Parse(colection["IdEntidadPrestadoraSalud"].ToString());
                contrato.IdRegimenSalud = Int32.Parse(colection["IdRegimenSalud"].ToString());
                
                
                try
                {
                    contrato.IdTrabajador = Int32.Parse(colection["Id_Trabajador"].ToString());
                }
                catch (Exception ex)
                {
                    var msg = ex.Message;
                    msg = "Debe seleccionar un Trabajador";

                    TempData["AlertMessage"] = msg;

                    return RedirectToAction("Create");
                }
                

                contrato.IdProyecto = Int32.Parse(colection["IdProyecto"].ToString());
                contrato.FechaInicio = Convert.ToDateTime(FechaInicio).Date;
                contrato.FechaTermino = Convert.ToDateTime(FechaTermino).Date;
                contrato.IdEspecialidad = Int32.Parse(colection["IdEspecialidad"].ToString());
                contrato.IdPeriodoPago = Int32.Parse(colection["IdPeriodoPago"].ToString());
                contrato.IdTipoPago = Int32.Parse(colection["IdTipoPago"].ToString());
                contrato.RemBruta = decimal.Parse(colection["RemBruta"].ToString());
                contrato.RemLiquida = decimal.Parse(colection["RemLiquida"].ToString());
                contrato.Bonos = decimal.Parse(colection["Bonos"].ToString());
                contrato.Observacion = colection["Observacion"].ToString();
                #endregion

                if (contrato.RemBruta >= 0 && contrato.RemLiquida >= 0
                    && contrato.Bonos >= 0 && contrato.RemBruta >= contrato.RemLiquida)
                {
                    if (contrato.FechaTermino >= contrato.FechaInicio)
                    {
                        contratoBL.AddContrato(contrato);
                        TempData["AlertMessage"] = "Registro Correcto";
                        return RedirectToAction("Create");
                    }
                    else
                    {
                        TempData["AlertMessage"] = "Rango de Fechas Incorrecto";
                        return RedirectToAction("Create");
                    }
                }
                else
                {
                   TempData["AlertMessage"] = "Campo de Remuneracion Incorrecto";
                   return RedirectToAction("Create");
                } 
            }
            catch (Exception ex)
            {
                TempData["AlertMessage"] = ex.Message;
                return RedirectToAction("Create");
            }
        }

        
        public ActionResult Edit(int id = 0)
        {

            if (id == 0)
            {
                return RedirectToAction("Index", "Contrato");
            }

            var contrato = contratoBL.GetFromContratoById(id);

            var a = contrato.FechaInicio.ToShortDateString();
            var b = contrato.FechaTermino.ToShortDateString();

            var FechaInicio = a.Substring(3, 2) + "/" + a.Substring(0, 2) + "/" + a.Substring(6, 4);
            var FechaTermino = b.Substring(3, 2) + "/" + b.Substring(0, 2) + "/" + b.Substring(6, 4);


            ViewData["FechaInicio"] = FechaInicio;
            ViewData["FechaTermino"] = FechaTermino;

            ViewData["Id_Trabajador"] = contrato.IdTrabajador.ToString();
            ViewData["TrabajadorSeleccionado"] = contrato.TRABAJADOR.PERSONA.NombreCompleto;
            
            

            if (contrato == null)
            {
                return RedirectToAction("Index", "Contrato");
            }

            var tipoPersonal = tipoPersonalBL.GetAllFromTipoPersonal();
            ViewData["IdTipoPersonal"] = new SelectList(tipoPersonal, "IdTipoPersonal", "Descripcion", contrato.IdTipoPersonal);

            var tipoTrabajador = tipoTrabajadorBL.GetAllFromTipoTrabajador();
            ViewData["IdTipoTrabajador"] = new SelectList(tipoTrabajador, "IdTipoTrabajador", "Descripcion", contrato.IdTipoTrabajador);

            var tipoContrato = tipoContratoBL.GetAllFromTipoContrato();
            ViewData["IdTipoContrato"] = new SelectList(tipoContrato, "IdTipoContrato", "Descripcion", contrato.IdTipoContrato);

            var areaContrato = areaContratoBL.GetAllFromAreaContrato();
            ViewData["IdAreaContrato"] = new SelectList(areaContrato, "IdAreaContrato", "Descripcion", contrato.IdAreaContrato);

            var regimenLaboral = regLabBL.GetAllFromRegimenLaboral();
            ViewData["IdRegimenLaboral"] = new SelectList(regimenLaboral, "IdRegimenLaboral", "Descripcion", contrato.IdRegimenLaboral);

            var entPrestSalus = entidadBL.GetAllFromEntidadPrestadoraSalud();
            ViewData["IdEntidadPrestadoraSalud"] = new SelectList(entPrestSalus, "IdEntidadPrestadoraSalud", "Descripcion", contrato.IdEntidadPrestadoraSalud);

            var regimenSalud = regimenSaludBL.GetAllFromRegimenSalud();
            ViewData["IdRegimenSalud"] = new SelectList(regimenSalud, "IdRegimenSalud", "Descripcion", contrato.IdRegimenSalud);

            var proyecto = proyectoBL.GetAllFromProyectos();
            ViewData["IdProyecto"] = new SelectList(proyecto, "IdProyecto", "NombreProyecto", contrato.IdProyecto);

            var especialidad = especialidadBL.GetAllFromEspecialidad();
            ViewData["IdEspecialidad"] = new SelectList(especialidad, "IdEspecialidad", "Descripcion", contrato.IdEspecialidad);

            var periodoPago = periodoBL.GetAllFromPeriodoPago();
            ViewData["IdPeriodoPago"] = new SelectList(periodoPago, "IdPeriocidadPago", "Descripcion", contrato.IdPeriodoPago);

            var tipoPago = tipoPagoBL.GetAllFromTipoPago();
            ViewData["IdTipoPago"] = new SelectList(tipoPago, "IdTipoPago", "Descripcion", contrato.IdTipoPago);

            return View(contrato);


        }

        
        [HttpPost]
        public ActionResult Edit(int id, FormCollection colection)
        {
            var a = colection["FechaInicio"].ToString();
            var b = colection["FechaTermino"].ToString();
            var FechaInicio = a.Substring(3, 2) + "-" + a.Substring(0, 2) + "-" + a.Substring(6, 4);
            var FechaTermino = b.Substring(3, 2) + "-" + b.Substring(0, 2) + "-" + b.Substring(6, 4);

            
            try
            {
                CONTRATO contrato = new CONTRATO();

                ///
                var motivo = motivoBL.GetFromMotivoFinPeriodoById(1);
                ///
                #region UpdateContrato
                contrato.IdContrato = id;
                contrato.IdMotivoFinPeriodo = motivo.IdMotivoFinPeriodo;
                contrato.IdTipoPersonal = Int32.Parse(colection["IdTipoPersonal"].ToString());
                contrato.IdTipoTrabajador = Int32.Parse(colection["IdTipoTrabajador"].ToString());
                contrato.IdTipoContrato = Int32.Parse(colection["IdTipoContrato"].ToString());
                contrato.IdAreaContrato = Int32.Parse(colection["IdAreaContrato"].ToString());
                contrato.IdRegimenLaboral = Int32.Parse(colection["IdRegimenLaboral"].ToString());
                contrato.IdEntidadPrestadoraSalud = Int32.Parse(colection["IdEntidadPrestadoraSalud"].ToString());
                contrato.IdRegimenSalud = Int32.Parse(colection["IdRegimenSalud"].ToString());

                try
                {
                    contrato.IdTrabajador = Int32.Parse(colection["Id_Trabajador"].ToString());
                }
                catch (Exception ex)
                {
                    var msg = ex.Message;
                    msg = "Debe seleccionar un Trabajador";

                    TempData["AlertMessage"] = msg;

                    return RedirectToAction("Edit");
                }

                contrato.IdProyecto = Int32.Parse(colection["IdProyecto"].ToString());
                contrato.FechaInicio = Convert.ToDateTime(FechaInicio).Date;
                contrato.FechaTermino = Convert.ToDateTime(FechaTermino).Date;
                contrato.IdEspecialidad = Int32.Parse(colection["IdEspecialidad"].ToString());
                contrato.IdPeriodoPago = Int32.Parse(colection["IdPeriodoPago"].ToString());
                contrato.IdTipoPago = Int32.Parse(colection["IdTipoPago"].ToString());
                contrato.RemBruta = decimal.Parse(colection["RemBruta"].ToString());
                contrato.RemLiquida = decimal.Parse(colection["RemLiquida"].ToString());
                contrato.Bonos = decimal.Parse(colection["Bonos"].ToString());
                contrato.Observacion = colection["Observacion"].ToString();
                #endregion

                if (contrato.RemBruta >= 0 && contrato.RemLiquida >= 0
                    && contrato.Bonos >= 0 && contrato.RemBruta >= contrato.RemLiquida)
                {
                    if (contrato.FechaTermino >= contrato.FechaInicio)
                    {
                        contratoBL.UpdateContrato(contrato);
                        TempData["AlertMessage"] = "Modificacion Correcta";
                        return RedirectToAction("Edit");
                    }
                    else
                    {
                        TempData["AlertMessage"] = "Rango de Fechas Incorrecto";
                        return RedirectToAction("Edit");
                    }
                }
                else
                {
                    TempData["AlertMessage"] = "Campo de Remuneracion Incorrecto";
                    return RedirectToAction("Edit");
                }
            }
            catch (Exception ex)
            {
                TempData["AlertMessage"] = ex.Message;
                
                return RedirectToAction("Edit");
            }
        }


        public ActionResult Delete(int id)
        {
            try
            {
                contratoBL.RemoveContrato(id);

                return RedirectToAction("Index");
            }
            catch(Exception ex)
            {
                TempData["AlertMessage"] = ex.Message;
                return RedirectToAction("Index");
            }
        }

    }
}
